<div class="doc-item" id="doc-1258"><h2 class="doc-item-name">repl<span class="namespace">(clojure.main)</span></h2><ul class="var-arglists"><li>(<span class="var-name">repl</span> &amp; options)</li></ul><div class="var-docstring"><p>Generic, reusable, read-eval-print loop. By default, reads from *in*,
  writes to *out*, and prints exception summaries to *err*. If you use the
  default :read hook, *in* must either be an instance of
  LineNumberingPushbackReader or duplicate its behavior of both supporting
  .unread and collapsing CR, LF, and CRLF into a single \newline. Options
  are sequential keyword-value pairs. Available options and their defaults:</p><p>- :init, function of no arguments, initialization hook called with
       bindings for set!-able vars in place.
       default: #()</p><p>- :need-prompt, function of no arguments, called before each
       read-eval-print except the first, the user will be prompted if it
       returns true.
       default: (if (instance? LineNumberingPushbackReader *in*)
                  #(.atLineStart *in*)
                  #(identity true))</p><p>- :prompt, function of no arguments, prompts for more input.
       default: repl-prompt</p><p>- :flush, function of no arguments, flushes output
       default: flush</p><p>- :read, function of two arguments, reads from *in*:
         - returns its first argument to request a fresh prompt
           - depending on need-prompt, this may cause the repl to prompt
             before reading again
         - returns its second argument to request an exit from the repl
         - else returns the next object read from the input stream
       default: repl-read</p><p>- :eval, funtion of one argument, returns the evaluation of its
       argument
       default: eval</p><p>- :print, function of one argument, prints its argument to the output
       default: prn</p><p>- :caught, function of one argument, a throwable, called when
       read, eval, or print throws an exception or error
       default: repl-caught</p></div><div class="var-source"><pre>; clojure/main.clj:113
(defn repl
  [&amp; options]
  (let [{:keys [init need-prompt prompt flush read eval print caught]
         :or {init        #()
              need-prompt (if (instance? LineNumberingPushbackReader *in*)
                            #(.atLineStart *in*)
                            #(identity true))
              prompt      repl-prompt
              flush       flush
              read        repl-read
              eval        eval
              print       prn
              caught      repl-caught}}
        (apply hash-map options)
        request-prompt (Object.)
        request-exit (Object.)
        read-eval-print
        (fn []
          (try
           (let [input (read request-prompt request-exit)]
             (or (#{request-prompt request-exit} input)
                 (let [value (eval input)]
                   (print value)
                   (set! *3 *2)
                   (set! *2 *1)
                   (set! *1 value))))
           (catch Throwable e
             (caught e)
             (set! *e e))))]
    (with-bindings
     (try
      (init)
      (catch Throwable e
        (caught e)
        (set! *e e)))
     (prompt)
     (flush)
     (loop []
       (when-not (= (read-eval-print) request-exit)
         (when (need-prompt)
           (prompt)
           (flush))
         (recur))))))</pre></div><div class="license"><p>Copyright (c) Rich Hickey. All rights reserved.</p><p>The use and distribution terms for this software are covered by the <a href="http://opensource.org/licenses/eclipse-1.0.php">Eclipse Public License 1.0</a>, which can be found in the file
          epl-v10.html at the root of this distribution. By using this software
          in any fashion, you are agreeing to be bound by the terms of this
          license. You must not remove this notice, or any other, from this
          software.</p></div></div>